package com.turing.system.utils;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class FileUtils {
	/**
	 * 上传文件到硬盘
	 * @param path 路径
	 * @param picFile 上传的文件
	 * @return 文件名
	 */
	public static String upload(String path, MultipartFile picFile) {
		mkdirs(path);
		return saveFile(picFile, path);
	}
	/**
	 * 删除文件
	 * @param path 目录
	 * @param fileName 文件名
	 * @return true删除成功, false-删除失败
	 */
	public static boolean deleteFile(String path, String fileName) {
		boolean bj = false;
		//如果文件名为null或者为空,则不删除
		if (fileName != null && !"".equals(fileName)) {
			File file = new File(path+"/"+fileName);
			if (file.exists()) {
				bj = file.delete();
			}
		}
		return bj;
	}
	/**
	 * 删除目录内的所有图片
	 * @param path 路径
	 */
	public static void deleteAll(String path) {
		File dirFile = new File(path);
		if (dirFile.exists()) {
			File[] files = dirFile.listFiles();
			for (int i = 0; i < files.length; i++) {
				File file = files[i];
				if (file.isFile()) {
					file.delete();
				}
			}
		}
	}
	/**
	 * 删除目录内指定的文件
	 * @param path 路径
	 * @param fileNameList 文件名list
	 */
	public static void deleteFile(String path, List<String> fileNameList) {
		for (int i = 0; i < fileNameList.size(); i++) {
			String fileName = fileNameList.get(i);
			File file = new File(path + fileName);
			if (file.exists()) {
				file.delete();
			}
		}
	}
	/**
	 * 从硬盘中下载文件
	 * @param path 文件名
	 * @param fileName 响应
	 * @param response 下载文件的路径
	 * @throws IOException
	 */
	public static void download(String path, String fileName, HttpServletResponse response) throws IOException {
		download(fileName, response, path, 1048576);
	}

	/**
	 * 从硬盘中下载文件
	 * @param fileName 文件名
	 * @param response 响应
	 * @param path 下载文件的路径
	 * @param bufferSize 缓存大小, 默认1048576字节
	 * @throws IOException
	 */
	public static void download(String fileName, HttpServletResponse response, String path, Integer bufferSize) throws IOException {
		if (!path.endsWith("/")) {
			path = path + "/";
		}
		if (fileName != null && !"".equals(fileName)) {
			File file = new File(path+fileName);
			if (!file.exists()) {
				response.setContentType("text/html; charset=UTF-8");
				response.getWriter().print("<html><body>您要下载的资源已被删除！<a href='javascript:history.back()'>返回</a></body></html>");
				response.getWriter().close();
				return;
			}else {
				/*开始下载*/
				response.setContentType("multipart/form-data");
				// 设置文件名
				response.addHeader("Content-Disposition","attachment;fileName=" + new String(fileName.getBytes(), "iso8859-1") );
				byte[] buffer = new byte[bufferSize]; //1M
				FileInputStream fis  = null;
				try{
					fis  = new FileInputStream(file);
					OutputStream os = response.getOutputStream();
					int i = fis.read(buffer);
					while (i != -1) {
						os.write(buffer, 0, i);
						i = fis.read(buffer);
					}
					fis.close();
					os.flush();
					os.close();
				}catch(Exception  e){
					e.printStackTrace();
				}
			}
		}else {
			response.setContentType("text/html; charset=UTF-8");
			response.getWriter().print("<html><body>您要下载的资源不存在！<a href='javascript:history.back()'>返回</a></body></html>");
			response.getWriter().close();
		}
	}

	/**
	 * 存储到指定的目录内
	 * @param picFile 上传的文件
	 * @param path 文件路径
	 * @return 文件名
	 */
	private static String saveFile(MultipartFile picFile, String path) {
		if (!path.endsWith("/")) {
			path = path + "/";
		}
		//获取文件的扩展名
		String picFileName = picFile.getOriginalFilename();
		String ext = picFileName.substring(picFileName.lastIndexOf("."));
		String fileName = UUID.randomUUID().toString()+ext;
		File dest = new File(path+fileName);
		try {
			picFile.transferTo(dest);
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
		return fileName;
	}
	/**
	 * 移动文件
	 * @param fileName 文件名称
	 * @param sourcePath 源目录
	 * @param destPath 目标目录
	 */
	public static Boolean moveFile(String fileName, String sourcePath, String destPath) {
		//如果目标目录不存在则创建
		mkdirs(destPath);
		File startFile = new File(sourcePath + fileName);
		if (!startFile.exists()) {
			return false;
		}
		File endFile = new File(destPath + fileName);
		try {
			if (startFile.renameTo(endFile)) {
				return true;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 如果目录不存在,则创建目录
	 * @param destPath
	 */
	private static void mkdirs(String destPath) {
		File destFile = new File(destPath);
		if (!destFile.exists()) {
			destFile.mkdirs();
		}
	}

	/**
	 * 复制文件
	 * @param fileName 文件名称
	 * @param sourcePath 源目录
	 * @param destPath 目标目录
	 */
	public static Boolean copyFile(String fileName, String sourcePath, String destPath) {
		//如果目标目录不存在则创建
		mkdirs(destPath);
		File startFile = new File(sourcePath + fileName);
		if (!startFile.exists()) {
			return false;
		}
		try{
			//创建输入流对象
			FileInputStream fis = new FileInputStream(sourcePath+fileName);
			//创建输出流对象
			FileOutputStream fos = new FileOutputStream(destPath+fileName);
			//创建搬运工具
			byte[] buffer = new byte[1024*8];
			//创建长度
			int len = 0;
			//循环读取数据
			while((len = fis.read(buffer))!=-1)
			{
				fos.write(buffer,0,len);
			}
			fis.close();//释放资源
			fis.close();//释放资源
			return true;
		}catch (Exception e){
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 从请求路径的字符串数组里,提取文件名
	 * @param upPics /temp/aa.jpg, /temp/aa.jpg
	 * @return
	 */
	public static List<String> getFileNameByImgSrc(String upPics) {
		if (upPics != null && !"".equals(upPics)) {
			List<String> list = new ArrayList<>();
			String[] upPicStrs = upPics.split(",");
			for (int i = 0; i < upPicStrs.length; i++) {
				String str = upPicStrs[i];
				String fileName = str.substring(str.lastIndexOf("/")+1);
				list.add(fileName);
			}
			return list;
		}
		return null;
	}

	/**
	 * 找出第一个list相对于第二个list的差集
	 * @return 差集
	 */
	public static List<String> diff(List<String> list1, List<String> list2) {
		List<String> result = new ArrayList<>(list1);
		result.removeAll(list2);
		return result;
	}
}
